<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        // //工厂模式
        // function Person(name ,age){
        //     var obj = {};
        //     obj.name = name;
        //     //this.name = name; 相同
        //     obj.age = age;
        //     obj.study = function(){
        //         console.log("...")
        //     }
        //     return obj;
        // }
        // var li = Person("li",23)
        // console.log(li);

        //构造函数
        // 不用创建新对象 不用return
        function Person(name,age){
            this.name = name;
            this.age =age;
            // this.study = function(){
            //     console.log("对象内");
            // }

        }
        // new出来的对象叫实力对象
        var li = new Person("lii",34);
        console.log(li);

        //因为每个对象都有study方法 占用内存故：
        // 直接拉出来 会出现不同对象 方法重名问题
        // function study(){
        //     console.log("外拉方法");
        // }
        // li.study = study;
        // console.log(li);

        //解决方法 原型属性
        // 要把外啦方法删掉
        Person.prototype.study = function(){
            // Person.prototype 是个对象
            console.log("原型属性，不用 li.study = study;");
        }
        console.log(li);
        console.log(li.study);
        console.log(li.__proto__);
        console.log(Person.prototype);

        //工厂
        console.log("工厂-------")
        function Animals(name,maxAge,voice){
            var a = {};
            a.name = name;
            a.maxAge = maxAge;
            a.voice = voice;
            a.shoot =function(){
                console.log(voice+voice+voice);
            }
            return a;
        }
        var cat = Animals(cat,5,"喵");
        console.log(cat);
        cat.shoot();
opacite
        //构造函数

        // function Animals (name ,maxAge,voice){
        //     tfhis.name = name;
        //     this.maxAge = maxAge;
        //     this.voice = voice;
        //     this.shoot  = function(){
        //         console.log(voice+voice+voice);
        //     }
        // }
        // // function shoot(){
        // //     console.log(getvoice()+voice+voice);
        // // }

        // // Animals.prototype.shoot = function(){
        // //     console.log(voice+voice+voice);
        // // }
        // var dog = new Animals(dog,6,"汪");
        // console.log(dog);
        // console.log(dog.shoot);
    </script>
    <script>
        // function Dog(name, color){
        //     var d= {};
        //     d.name = name;
        //     d.color = color;
        //     d.shoot = function(){
        //         console.log("d1...");
        //     }
        //     return d;
        // }
        // var d1 = Dog("腊肠","brown");
        // console.log(d1);
        // console.log(d1.shoot);

        function Dog(name ,color){
            this.name = name;
            this.color = color;
            // this.shoot = function(){
            //     console.log("d2...");
            // }
        }
     
        var d2 = new Dog("d2name","d2color");
        console.log(d2);

        Dog.prototype.eat = function(){
            console.log("eat..")
        }
        console.log(d2);
        console.log(d2.shoot);  
        console.log(d2.eat)
        //打印没有eat 的原因 ：定义的eat是Dog继承的 dog的eat 指向继承函数
        // 而 dog 本身并无这个属性
        /* 任何一个实力都继承自远行对象，即原型式继承*/
    </script>
    <script>
        var Function = new Function();
        console.log(Function.prototype.__proto__);
    </script>
    <script>
        console.log("//..............//");
        //变量的声明也要提升 但是只提升声明，不提升赋值

    </script>
   
</body>
</html>